﻿using System;
using System.Text;


namespace JH
{
    /// <summary>
    ///  语言范围
    /// </summary>
    public enum Language
    {
        Other,
        English,
    }

    /// <summary>
    ///  智能模糊匹配器
    /// </summary>
    public static class SmartFuzzyMatcher
    {
        /// <summary>
        ///  随机数生成器
        /// </summary>
        private static readonly Random Random = new Random();

        /// <summary>
        /// 检测字符串是否主要为英文
        /// </summary>
        /// <param name="input">输入的字符串</param>
        /// <param name="sampleSize">采样大小，默认为100</param>
        /// <returns>如果主要是英文返回true，否则返回false</returns>
        public static bool IsMainlyEnglish(string input, int sampleSize = 100)
        {
            if (string.IsNullOrEmpty(input))
                return false;

            int englishCount = 0;
            int nonEnglishCount = 0;

            // 将输入字符串转换为字节数组
            byte[] bytes = Encoding.UTF8.GetBytes(input);
            int totalBytes = bytes.Length;

            // 随机采样
            for (int i = 0; i < Math.Min(sampleSize, totalBytes); i++)
            {
                int index = Random.Next(0, totalBytes);
                byte b = bytes[index];

                // 判断是否为ASCII字符（0-127）
                if (b <= 127)
                {
                    englishCount++;
                }
                else
                {
                    nonEnglishCount++;
                }
            }

            // 如果英文字符数量多于非英文字符，则认为主要是英文
            return englishCount > nonEnglishCount;
        }

        public static FuzzyMatcherBase GetMatcher(string match)
        {
            var language = IsMainlyEnglish(match) ? Language.English : Language.Other;
            //nameof(SmartFuzzyMatcher).Log($"检测到{match}的语言为{language},将使用{language}模糊匹配器");
            switch (language)
            {
                //如果是英文返回英文模糊匹配器
                case Language.English:
                    return new StringFuzzyMatcherEn();

                //其他语言返回中文模糊匹配器
                default:
                    return new StringFuzzyMatcherCn();
            }
        }
    }
}